ODDR(Output Double Data Rate,双数据率输出)原语是 FPGA 内部(特别是 Xilinx FPGA 的 I/O 模块中)一个非常重要的底层硬件资源。
简单来说,它的核心功能是:在一个时钟周期内,利用时钟的上升沿和下降沿向外部引脚发送两次数据。
以下是关于 ODDR 的详细使用说明和应用场景解析
ODDR 的基本原理与端口说明
普通触发器(Flip-Flop)只能在时钟的单边沿(通常是上升沿)更新数据。而 ODDR 是硬线逻辑,专门放置在 FPGA 芯片边缘的 IOB(输入/输出块)中,紧挨着芯片引脚。
实例化代码模板(以 Xilinx 7 系列为例)
1 | ODDR #( |
DDR_CLK_EDGE(决定了 FPGA 内部逻辑如何将数据送给ODDR)OPPOSITE_EDGE(相反边沿): 传统模式。内部逻辑必须在时钟上升沿准备好D1,在下降沿准备好D2。这在 FPGA 内部布线中很难满足时序要求,一般仅在时钟转发(D1=1, D2=0 常数)时使用。SAME_EDGE(相同时钟边沿): 推荐模式。内部逻辑只需要在同一个时钟上升沿同时准备好D1和D2。ODDR内部会自动将D2缓存半个周期,然后准确地在下降沿输出。这极大地降低了内部时序收敛的难度。
什么情况下使用 ODDR?
时钟转发(Clock Forwarding)
当需要将 FPGA 内部的系统时钟输出给外部芯片(如显示屏驱动、摄像头、PHY 芯片)时。
- 配置方法:
D1 = 1,D2 = 0,模式选OPPOSITE_EDGE。 - 为什么不用普通的管脚输出? 全局时钟网络无法直接连接到普通输出引脚,必须经过
ODDR。这样输出的时钟质量最高,抖动(Jitter)最小,且与数据信号的延迟(Skew)能完美匹配。
高速双沿数据传输(True DDR Data)
外部接收芯片要求在时钟的上升沿和下降沿都接收数据,以提高带宽(时钟频率不变,数据吞吐量翻倍)。
- 典型协议:
- 千兆以太网接口(RGMII):TXD 信号线在上升沿发送低 4 位,在下降沿发送高 4 位。
- DDR 内存控制器:在 DQS 时钟的双沿发送数据。
- 高速 ADC / DAC 接口。
- 配置方法: 将并行数据转换为双沿输出,模式选
SAME_EDGE。
源同步接口(Source-Synchronous)中的精确时序对齐
在源同步设计中,FPGA 需要同时输出“时钟”和“数据”。 为了让外部芯片能稳定采样,时钟和数据到达引脚的物理延迟必须一致。
- 做法: 数据信号通过
ODDR输出(哪怕外部只需单沿采样,也可以让D1=D2=数据,或者让 D2 输出无效位);时钟信号也通过旁边的ODDR输出。 - 效果: 两者都在 IOB 内部完成最后一步寄存,利用了物理位置完全相同的布线资源,最大程度消除了布线延迟差异,保证了完美的时序对齐。
可以把 ODDR 想象成 FPGA 内部世界(单边沿、低速、宽总线)与外部世界(双边沿、高速、窄总线)之间的“高速收费站”。